package me.xhy.java.springboot3.webflux.projectreactor.s3projectreactor;

import reactor.core.publisher.Flux;

public class S7Error {
  public static void main(String[] args) {

    // 1. 消费者可以感知到生产者发生异常
    // publisher 发生异常，会提前终端流
    // error 是终端信号，不是完成信号。
    System.out.println("1. 消费者可以感知到生产者发生异常");
    Flux.just(1, 2, 0, 2, 1)
        .map(v -> 100 / v + "")
        .subscribe(
            // 消费值
            v -> System.out.println("value = " + v),
            // 消费error
            err -> System.out.println("error = " + err),
            // 完成时执行
            () -> System.out.println("done")
        );

    // 2. 消费者不能感知生产者的异常
    // onErrorReturn 1.吃掉异常、消费者无异常；2. 会正常返回内容、正常出发 complete 信号 3. 短路，异常后的元素不会流动
    System.out.println("2. onErrorReturn 消费者不能感知生产者的异常");
    Flux.just(1, 2, 0, 2, 1)
        .map(v -> 100 / v + "")
        .onErrorReturn(ArithmeticException.class, "数学运算错误")
        .onErrorReturn(Exception.class, "IO错误")
        .subscribe(
            // 消费值
            v -> System.out.println("value = " + v),
            // 消费error
            err -> System.out.println("error = " + err),
            // 完成时执行
            () -> System.out.println("done")
        );

    // 3. 自定义发生异常的逻辑
    // onErrorResume 1. 吃掉异常 2. 返回一个流 3. 短路
    System.out.println("3. onErrorResume 自定义发生异常的逻辑");
    Flux.just(1, 2, 0, 2, 1)
        .map(v -> 100 / v + "")
        .onErrorResume(
            ArithmeticException.class,
            err -> Flux.just(err.getMessage())
        ).log().subscribe();

    // 4. onErrorMap 订阅者会感知到错误
    System.out.println("4. onErrorMap 将错误 映射成 另外一种错误");
    Flux.just(1, 2, 0, 2, 1)
        .map(v -> 100 / v + "")
        .onErrorMap(err -> new RuntimeException())
        .log().subscribe();

    // 5. doOnerror
    System.out.println("5. onErrorMap 做一些逻辑，不需要返回值");
    Flux.just(1, 2, 0, 2, 1)
        .map(v -> 100 / v + "")
        .doOnError(err -> System.out.println("doOnError: " + err))
        .log()
        .subscribe(
            v -> System.out.println("订阅者收到值： " + v),
            err -> System.out.println("订阅者收到异常： " + err.getMessage()),
            () -> System.out.println("done")
        );

    // onErrorContinue 忽略错误，继续流动

    // onFinal 无论流的状态是什么，都要执行的逻辑

    // onErrorComplete

    // onErrorStop 发生错误，中断所有订阅者，正常的订阅者也中断
    System.out.println("=== === ===");
  }
}
